﻿#ifndef DAAPPDATAMANAGER_H
#define DAAPPDATAMANAGER_H
#include <QObject>
#include "DADataManagerInterface.h"
#include <memory>
#include "DAGlobals.h"
namespace DA
{
DA_IMPL_FORWARD_DECL(DAAppDataManager)
class DACoreInterface;
/**
 * @brief DA的变量管理类，da的变量统一由此类管理
 */
class DAAppDataManager : public DADataManagerInterface
{
    Q_OBJECT
    DA_IMPL(DAAppDataManager)
public:
    /**
     * @brief 改变类型
     */
    enum ChangeType
    {
        ChangeName,      ///< 改变了名字
        ChangeDescribe,  ///< 改变了描述
        ChangeValue      ///< 改变了值
    };
    Q_ENUM(ChangeType)
public:
    DAAppDataManager(DACoreInterface* c, QObject* p = nullptr);
    ~DAAppDataManager();
    //添加数据,返回数据的名字，添加数据时数据名字有可能会改变
    void addData(const DAData& d) override;
    //移除数据
    void removeData(const DAData& d) override;
    //获取数据量
    int getDataCount() const override;
    //参数的索引
    int dataIndex(const DAData& d) const override;
    //根据索引获取对应的值
    DAData getData(int index) const override;
    //触发dataInfomationChanged信号
    void callDataInfomationChanged(const DAData& d, ChangeType t);

private:
    void setUniqueDataName(DAData& d) const;
    //把所有管理的变量的名字按照set返回
    QSet< QString > getDatasNameSet() const;
signals:
    /**
     * @brief 数据信息改变
     * @param d 数据
     * @param oldname
     */
    void dataInfomationChanged(const DAData& d, ChangeType t);
};
}  // namespace DA
#endif  // DADATAMANAGER_H
